#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

// ------------------------- 节点结构定义 -------------------------

/**
 * @brief 定义单链表节点结构体
 */
typedef struct node {
    int data;           // 数据域：存储整数数据
    struct node *next;  // 指针域：指向下一个节点
} node, *link;           // 定义 node 类型和 link 指针别名（简化代码书写）

// ------------------------- 节点创建函数 -------------------------

/**
 * @brief 创建一个新节点并初始化
 * @param value 新节点的数据值
 * @return 新节点的指针，若分配失败返回 NULL
 */
link createNode(int value) {
    link newNode = (link) malloc(sizeof(node));  // 分配内存空间
    if (newNode == NULL) return NULL;            // 判断是否分配成功
    newNode->data = value;                       // 设置数据域
    newNode->next = NULL;                        // 默认指向 NULL
    return newNode;
}

// ------------------------- 尾插函数 -------------------------

/**
 * @brief 尾插法向链表末尾添加一个节点
 * @param head 链表头指针地址（可能为空）
 * @param value 要插入的数据
 * @return true 插入成功，false 内存分配失败
 */
bool insertTail(link *head, int value) {
    link newNode = createNode(value);     // 创建新节点
    if (newNode == NULL) return false;    // 如果创建失败返回 false

    if (*head == NULL) {
        // 链表为空，直接插入为头节点
        *head = newNode;
        return true;
    }

    // 链表非空，找到最后一个节点
    link cur = *head;
    while (cur->next != NULL) {
        cur = cur->next;
    }
    cur->next = newNode;  // 将新节点链接到末尾
    return true;
}

// ------------------------- 链表正序打印 -------------------------

/**
 * @brief 正序打印链表
 * @param head 链表头指针
 */
void printLink(link head) {
    link cur = head;  // 从头开始遍历
    while (cur) {
        printf("value is %d\n", cur->data);  // 打印当前节点数据
        cur = cur->next;                     // 移动到下一个节点
    }
    printf("\n");
}

// ------------------------- 链表倒序打印（递归） -------------------------

/**
 * @brief 使用递归方式倒序打印链表
 * @param head 链表头指针
 */
void translatePrint(link head) {
    if (head == NULL) return;   // 递归终止条件：空节点
    translatePrint(head->next); // 递归调用：一直向后到尾节点
    printf("translate value is %d\n", head->data); // 回溯时打印
}

// ------------------------- 销毁链表 -------------------------

/**
 * @brief 释放整个链表占用的内存
 * @param head 链表头指针地址
 * @return true 表示释放成功
 */
bool destoryLink(link *head) {
    link cur = *head;
    while (cur != NULL) {
        link temp = cur;        // 暂存当前节点
        cur = cur->next;        // 移动到下一个节点
        free(temp);             // 释放当前节点
    }
    *head = NULL;               // 释放后将头指针设为 NULL
    return true;
}

// ------------------------- 主函数 -------------------------

int main() {
    link head = NULL;  // 初始化空链表

    // 插入数据构造链表：3 -> 2 -> 1
    insertTail(&head, 3);  // 插入后：3
    insertTail(&head, 2);  // 插入后：3 -> 2
    insertTail(&head, 1);  // 插入后：3 -> 2 -> 1

    // 正序打印链表
    printf("正序打印链表：\n");
    printLink(head);

    // 删除操作示例（已注释）：
    // delUniqueValue(&head, 1);    // 删除唯一值为 1 的节点
    // delMutilValue(&head, 1);     // 删除所有值为 1 的节点

    // 倒序打印链表
    printf("倒序打印链表：\n");
    translatePrint(head);

    // 可选：销毁链表（避免内存泄漏）
    // destoryLink(&head);

    return 0;
}
